home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_12 / guthrie2 / xlate.c < prev   
C/C++ Source or Header  |  1994-09-25  |  20KB  |  488 lines

  1. /**************************************************************************
  2. *  File Name     : XLATE.C
  3. *  Description   : Text Substitution Software tool for Multi Language
  4. *                  Support.
  5. *  Author        : R. Scott Guthrie  /  All Rights Reserved
  6. *  History       : 01/13/94 - Modification to add Speed-Up code for
  7. *                             loading '.TRB' files.
  8. *                  01/20/94 - Function names changed to avoid possible
  9. *                             conflicts with users code.
  10. **************************************************************************/
  11. /*  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  12.  *   Function       : XlateSet() 
  13.  *   Arguments      : (char *) File name of translation file (without ext).
  14.  *   Return         : None
  15.  *   Description    : USER CALLABLE - This function sets the file name
  16.  *                    to be used for string translation.
  17.  *                    If user does not call this function, the translate
  18.  *                    system will use the default file specified in
  19.  *                    constant 'DefaultFileName'.  No checking for
  20.  *                    file existance is performed by this function.
  21.  *   ---------------
  22.  *   Function       : Xlate() 
  23.  *   Arguments      : (char *) String to be translated.
  24.  *   Return         : (char *) Translation string.
  25.  *   Description    : USER CALLABLE - This function translates the string
  26.  *                    passed in, to the translated version in the translate
  27.  *                    table.  If the table has not been loaded, it
  28.  *                    initiates that action before attempting the
  29.  *                    translation.  If no match is found, then a '?' is
  30.  *                    returned.
  31.  *   ---------------
  32.  *   Function       : XlateLoad() 
  33.  *   Arguments      : (char *) File name of translation file.
  34.  *   Return         : (int) function status
  35.  *   Description    : INTERNAL FUNCTION - Called by 'Xlate()' to build the
  36.  *                    translation table.
  37.  *   ---------------
  38.  *   Function       : XlateLoadBinary() 
  39.  *   Arguments      : (FILE) File Descriptor of the binary translation file.
  40.  *   Return         : (int) function status
  41.  *   Description    : INTERNAL FUNCTION - Called by 'XlateLoad()' to
  42.  *                    load the binary translation table from a TRB file.
  43.  *   ---------------
  44.  *   Function       : XlateLoadText() 
  45.  *   Arguments      : (FILE) File descriptor of the Text translation file.
  46.  *   Return         : (int) function status
  47.  *   Description    : INTERNAL FUNCTION - Called by 'XlateLoad()' to
  48.  *                    build and load the translation table from a TRN file.
  49.  *   ---------------
  50.  *   Function       : XlateFree() 
  51.  *   Arguments      : None
  52.  *   Return         : None
  53.  *   Description    : USER CALLABLE - This function is used to free the
  54.  *                    memory allocated for the TRANSLATE system. It is used
  55.  *                    internally and callable directly.
  56.  *   ---------------
  57.  *   Function       : XlateSearchCompare()
  58.  *   Arguments      : (const void *) Pointer to compare string 1.
  59.  *                    (const void *) Pointer to compare string 2.  
  60.  *   Return         : (int) Compare status
  61.  *   Description    : INTERNAL FUNCTION - Search Compare Function.
  62.  *   ---------------
  63.  *   Function       : XlateSortCompare()
  64.  *   Arguments      : (const void *) Pointer to compare string 1.
  65.  *                    (const void *) Pointer to compare string 2.
  66.  *   Return         : (int) Compare status
  67.  *   Description    : INTERNAL FUNCTION - Sort Compare Function.
  68.  *   ---------------
  69.  *   Function       : XlateGetString() 
  70.  *   Arguments      : (FILE) File descriptor of the Text translation file.
  71.  *                    (char *) Pointer to a string.
  72.  *   Return         : (int) Number of characters in string or -1 for EOF 
  73.  *   Description    : INTERNAL FUNCTION - Called by 'XlateLoadText()'
  74.  *                    Reads and parses through the TRN file and returns
  75.  *                    the next String value found.
  76.  *   ---------------
  77.  *   Function       : XlateCreateTable()
  78.  *   Arguments      : (int) Number of XLATE entries.
  79.  *   Return         : (int) 1 for success, -1 for Allocation Error. 
  80.  *   Description    : INTERNAL FUNCTION - Called by 'XlateLoadText()'
  81.  *                    and 'XlateLoadBinary()' to allocate memory
  82.  *                    for the Translate Table.
  83.  *  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
  84.  
  85. #include <stdio.h>
  86. #include <stdlib.h>
  87. #include <string.h>
  88. #include <io.h>
  89. #include <fcntl.h>
  90. #include <alloc.h>
  91. #include <assert.h>
  92. #include "xlate.h"
  93.  
  94. /* GLOBAL VARAIBLES */
  95. XLATE  *XlateBase = NULL;
  96. int    XlateLines = 0;
  97. char   *XlateFile = XlateDefaultFileName;
  98.  
  99. /* FUNCTION DEFINITIONS */
  100. /*========================================*/
  101.   void XlateSet(char *translate_file_name)
  102. /*========================================*/
  103. /* Establish Translation Table Name */
  104. {
  105.   XlateFree();                        /* clear any existing table */
  106.   XlateFile = translate_file_name;    /* set to new file name. */
  107.   return;
  108. } /* end function 'XlateSet()' */
  109.  
  110. /*=============================*/
  111.   char *Xlate(char *key_string)
  112. /*=============================*/
  113. /* Translate a given KEY string to a Translated version by searching */
  114. /* through the Translation table. */
  115. {
  116.   XLATE *node;                        /* Allocate pointer to an XLATE node */
  117.   static char Default[] = "?";        /* Default String */
  118.  
  119.   /* If the translation file has not been read in, then load it. */
  120.   if(!XlateBase)
  121.     (void) XlateLoad(XlateFile);
  122.  
  123.   if(!XlateBase)                      /* If file wasn't loaded (found), */
  124.     return(Default);                  /* Return the default string */
  125.  
  126.   /* Search translation block for matching key string. */
  127.   if((node = (XLATE *)bsearch(key_string, XlateBase,
  128.       XlateLines, sizeof(XLATE), XlateSearchCompare)) == NULL)
  129.     return(Default);                  /* If no KEY is found */
  130.  
  131.   /* Return pointer to the translated value. */
  132.   return(node->translated_value);
  133.  
  134. } /* end function 'Xlate()' */
  135.  
  136. /*=============================*/
  137.   int XlateLoad(char *filename)
  138. /*=============================*/
  139. /* This function is used to load a translation definition file.  */
  140. /* Returns the number of Translate Table Entires or:             */
  141. /*    0 if no file is found. (either ".TRB" or ".TRN")           */
  142. /*   -1 if memory allocation error encountered.                  */
  143. {
  144.   char  filenamebuf[128];       /* Filename Buffer */
  145.   FILE  *fd;                    /* Translation File Descriptor */
  146.   int retval = 0;               /* return variable */
  147.  
  148.   /* Delete any existing 'in memory' translate table */
  149.   XlateFree();
  150.  
  151.   /* Attempt to open a Binary Version of the translate file. */
  152.   sprintf(filenamebuf, "%s.TRB", filename);
  153.   if((fd = fopen(filenamebuf, "rb")) != NULL)
  154.   {
  155.     retval = XlateLoadBinary(fd);
  156.     fclose(fd);                      /* Finished with file */
  157.   }
  158.   else                               /* Binary file did not open */
  159.   {
  160.     /* Attempt to open a Text Version of the translate file. */
  161.     sprintf(filenamebuf, "%s.TRN", filename);
  162.     if((fd = fopen(filenamebuf, "r")) != NULL)
  163.     {
  164.       retval = XlateLoadText(fd);
  165.       fclose(fd);                    /* Finished with file */
  166.     }
  167.   }
  168.   /* If there was an error, then free any memory that did happen */
  169.   /* to get allocated for the table and any Keys or Results.     */
  170.   if(retval <= 0)
  171.     XlateFree();
  172.  
  173.   return(retval);
  174. }  /* end 'XlateLoad()' */
  175.  
  176. /*=============================*/
  177.   int XlateLoadBinary(FILE *fd)
  178. /*=============================*/
  179. /* Loads the binary version of the translate file.  This loads */
  180. /* faster than the Text version.                               */
  181. {
  182.   /* Binary File format is:                          */
  183.   /*  4 bytes = ".TRB"  (File Signature)             */
  184.   /*  integer # of lines                             */
  185.   /*  integer # of line sets of:                     */
  186.   /*    integer size of key string                   */
  187.   /*    null terminated key string                   */
  188.   /*    integer size of result string                */
  189.   /*    null